package com.jiankangjin.weixinchannel.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jiankangjin.httpclient.HttpClient;
import com.jiankangjin.weixinchannel.util.ResponseHandler;

/**
 * 接收公众号支付异步通知接口：/public_notify
 * 微信支付v3.3.5版本
 */
@Controller
public class PublicNotifyController {
	private static final Log logger=LogFactory.getLog(PublicNotifyController.class);
	
	/**
	 * 接收微信后台通知接口
	 */
	@RequestMapping(value="/public_notify")
	@ResponseBody
	public String notify(HttpServletRequest request, HttpServletResponse response) {
		try {
			ResponseHandler resHandler = new ResponseHandler(request, response);
			
			Map<String, String> map = resHandler.xmlMap;
			logger.info("异步通知XML参数:"+map);
			
			String return_code = map.get("return_code"); //SUCCESS/FAIL
//			String return_msg = map.get("return_msg"); //返回信息=签名失败/参数格式校验错误
			if ("SUCCESS".equals(return_code)) {
				//以下字段在 return_code 为  SUCCESS 的时候有返回
//				String appid = map.get("appid"); 				//公众账号 ID
//				String mch_id = map.get("mch_id"); 			//商户号
//				String sub_mch_id = map.get("sub_mch_id"); 	//子商户号
//				String device_info = map.get("device_info"); 	//设备号
//				String nonce_str = map.get("nonce_str"); 		//随机字符串
//				String sign = map.get("sign");	 			//签名
				String result_code = map.get("result_code"); 	//业务结果SUCCESS/FAIL
//				String err_code = map.get("err_code"); 	//错误代码	
																		//NOAUTH--商户无权限
																		//NOTENOUGH--余额不足
																		//NOTSUPORTCARD--不支持卡类型
																		//ORDERPAID--商户订单已支付
																		//ORDERCLOSED--订单已关闭
																		//BANKERROR--银行系统异常
																		//SYSTEMERROR--系统错误
//				String err_code_des = map.get("err_code_des"); //错误代码描述
				if ("SUCCESS".equals(result_code)) {
					//以下字段在return_code和result_code都为 SUCCESS 的时候有返回
					String openid = map.get("openid"); //用户标识 用户在商户 appid 下的唯一标识
//					String is_subscribe = map.get("is_subscribe"); //是否关注公众账号 Y/N
//					String trade_type = map.get("trade_type"); //交易类型 JSAPI、NATIVE、MICROPAY、APP
//					String bank_type = map.get("bank_type"); //付款银行
					String total_fee = map.get("total_fee"); //总金额 单位为分
//					String coupon_fee = map.get("coupon_fee"); //现金券金额 现金券支付金额<=订单总金
//					String fee_type = map.get("fee_type"); //人民币：CNY
					String transaction_id = map.get("transaction_id"); //微信支付订单号
					String out_trade_no = map.get("out_trade_no"); //商户系统的订单号
//					String attach = map.get("attach"); //商家数据包，原样返回
					String time_end = map.get("time_end"); //支 付 完 成 时 间
					
					//通知交易系统
					Map<String, Object> params = new HashMap<String, Object>();
					params.put("notify_type", "pay_sync");
					params.put("out_trade_no", out_trade_no);
					params.put("order_id", "");
					params.put("pay_cry", "156");
					params.put("pay_amt", total_fee);
					params.put("pay_chnl_seq", transaction_id);
					params.put("pay_fin_time", time_end);
					params.put("Pay_chnl_pos", "");
					params.put("Pay_chnl_mer", "");
					params.put("Pay_chnl_fee", "");
					params.put("pay_user", openid);
					params.put("sub_deal_status", "1001");
					params.put("sub_deal_msg", "交易成功");
					logger.info("通知交易系统：" + params);
					Map<String, Object> returnMap = HttpClient.getInstance().doPOSTgetHashMap("/transSystem/channel_notify", params);
					logger.info("通知交易系统返回：" + returnMap);
					if (returnMap != null && "0000".equals(returnMap.get("resp_status"))) {
						return "<xml><return_code>SUCCESS</return_code></xml>";
					}
				}
			}
		} catch (Exception e) {
			logger.error(this, e);
		}
		return "<xml><return_code>FAIL</return_code><return_msg>hate you</return_msg></xml>";
	}
}
